set(libstdcxx_modulemap_target_list)
foreach(sdk ${SWIFT_SDKS})
  if(NOT ${sdk} IN_LIST SWIFT_LIBSTDCXX_PLATFORMS)
    continue()
  endif()

  foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES})
    set(arch_suffix "${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}")
    set(arch_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${arch}")

    set(module_dir "${SWIFTLIB_DIR}/${arch_subdir}")
    set(module_dir_static "${SWIFTSTATICLIB_DIR}/${arch_subdir}")

    set(libstdcxx_header "libstdcxx.h")
    set(libstdcxx_header_out "${module_dir}/libstdcxx.h")
    set(libstdcxx_header_out_static "${module_dir_static}/libstdcxx.h")
    set(libstdcxx_modulemap "libstdcxx.modulemap")
    set(libstdcxx_modulemap_out "${module_dir}/libstdcxx.modulemap")
    set(libstdcxx_modulemap_out_static "${module_dir_static}/libstdcxx.modulemap")

    add_custom_command_target(
        copy_libstdcxx_modulemap
        COMMAND
        "${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir}
        COMMAND
        "${CMAKE_COMMAND}" "-E" "copy_if_different" "${CMAKE_CURRENT_SOURCE_DIR}/${libstdcxx_modulemap}" "${libstdcxx_modulemap_out}"
        OUTPUT ${libstdcxx_modulemap_out}
        DEPENDS ${libstdcxx_modulemap}
        COMMENT "Copying libstdcxx modulemap to resources")
    list(APPEND libstdcxx_modulemap_target_list ${copy_libstdcxx_modulemap})
    add_dependencies(swift-stdlib-${arch_suffix} ${copy_libstdcxx_modulemap})

    add_custom_command_target(
        copy_libstdcxx_header
        COMMAND
        "${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir}
        COMMAND
        "${CMAKE_COMMAND}" "-E" "copy_if_different" "${CMAKE_CURRENT_SOURCE_DIR}/${libstdcxx_header}" "${libstdcxx_header_out}"
        OUTPUT ${libstdcxx_header_out}
        DEPENDS ${libstdcxx_header}
        COMMENT "Copying libstdcxx header to resources")
    list(APPEND libstdcxx_modulemap_target_list ${copy_libstdcxx_header})
    add_dependencies(swift-stdlib-${arch_suffix} ${copy_libstdcxx_header})

    if(SWIFT_BUILD_STATIC_STDLIB)
      add_custom_command_target(
          copy_libstdcxx_modulemap_static
          COMMAND
          "${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir_static}
          COMMAND
          "${CMAKE_COMMAND}" "-E" "copy_if_different"
          "${libstdcxx_modulemap_out}" "${libstdcxx_modulemap_out_static}"
          OUTPUT ${libstdcxx_modulemap_out_static}
          DEPENDS ${copy_libstdcxx_modulemap}
          COMMENT "Copying libstdcxx modulemap to static resources")
      list(APPEND libstdcxx_modulemap_target_list ${copy_libstdcxx_modulemap_static})
      add_dependencies(swift-stdlib-${arch_suffix} ${copy_libstdcxx_modulemap_static})

      add_custom_command_target(
          copy_libstdcxx_header_static
          COMMAND
          "${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir_static}
          COMMAND
          "${CMAKE_COMMAND}" "-E" "copy_if_different"
          "${libstdcxx_header_out}" "${libstdcxx_header_out_static}"
          OUTPUT ${libstdcxx_header_out_static}
          DEPENDS ${copy_libstdcxx_header}
          COMMENT "Copying libstdcxx header to static resources")
      list(APPEND libstdcxx_modulemap_target_list ${copy_libstdcxx_header_static})
      add_dependencies(swift-stdlib-${arch_suffix} ${copy_libstdcxx_header_static})
    endif()

    swift_install_in_component(FILES "${libstdcxx_modulemap_out}"
        DESTINATION "lib/swift/${arch_subdir}"
        COMPONENT sdk-overlay)
    swift_install_in_component(FILES "${libstdcxx_header_out}"
        DESTINATION "lib/swift/${arch_subdir}"
        COMPONENT sdk-overlay)

    if(SWIFT_BUILD_STATIC_STDLIB)
      swift_install_in_component(FILES "${libstdcxx_modulemap_out_static}"
          DESTINATION "lib/swift_static/${arch_subdir}"
          COMPONENT sdk-overlay)
      swift_install_in_component(FILES "${libstdcxx_header_out_static}"
          DESTINATION "lib/swift_static/${arch_subdir}"
          COMPONENT sdk-overlay)
    endif()

    if(${BOOTSTRAPPING_MODE} MATCHES "BOOTSTRAPPING.*")
      foreach(bootstrapping "0" "1")
        get_bootstrapping_path(bootstrapping_dir ${module_dir} ${bootstrapping})
        set(libstdcxx_modulemap_out_bootstrapping "${bootstrapping_dir}/libstdcxx.modulemap")
        set(libstdcxx_header_out_bootstrapping "${bootstrapping_dir}/libstdcxx.h")

        add_custom_command_target(unused_var
            COMMAND
            "${CMAKE_COMMAND}" "-E" "make_directory" "${bootstrapping_dir}"
            COMMAND
            "${CMAKE_COMMAND}" "-E" "copy_if_different"
            "${CMAKE_CURRENT_SOURCE_DIR}/${libstdcxx_modulemap}" "${libstdcxx_modulemap_out_bootstrapping}"

            CUSTOM_TARGET_NAME "copy-libstdcxx-modulemap-bootstrapping${bootstrapping}"
            OUTPUT "${libstdcxx_modulemap_out_bootstrapping}"
            DEPENDS ${libstdcxx_modulemap}
            COMMENT "Copying libstdcxx modulemap to resources for bootstrapping${bootstrapping}")

        add_custom_command_target(unused_var
            COMMAND
            "${CMAKE_COMMAND}" "-E" "make_directory" "${bootstrapping_dir}"
            COMMAND
            "${CMAKE_COMMAND}" "-E" "copy_if_different"
            "${CMAKE_CURRENT_SOURCE_DIR}/${libstdcxx_header}" "${libstdcxx_header_out_bootstrapping}"

            CUSTOM_TARGET_NAME "copy-libstdcxx-header-bootstrapping${bootstrapping}"
            OUTPUT "${libstdcxx_header_out_bootstrapping}"
            DEPENDS ${libstdcxx_header}
            COMMENT "Copying libstdcxx header to resources for bootstrapping${bootstrapping}")
      endforeach()
    endif()
  endforeach()
endforeach()
add_custom_target(libstdcxx-modulemap DEPENDS ${libstdcxx_modulemap_target_list})
set_property(TARGET libstdcxx-modulemap PROPERTY FOLDER "Miscellaneous")
add_dependencies(sdk-overlay libstdcxx-modulemap)


#
# C++ Standard Library Overlay.
#
add_swift_target_library(swiftstd STATIC NO_LINK_NAME IS_STDLIB
    std.swift
    String.swift

    SWIFT_MODULE_DEPENDS Cxx
    SWIFT_MODULE_DEPENDS_OSX Darwin
    SWIFT_MODULE_DEPENDS_IOS Darwin
    SWIFT_MODULE_DEPENDS_TVOS Darwin
    SWIFT_MODULE_DEPENDS_WATCHOS Darwin
    SWIFT_MODULE_DEPENDS_LINUX Glibc

    SWIFT_COMPILE_FLAGS ${SWIFT_RUNTIME_SWIFT_COMPILE_FLAGS} ${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
    -Xfrontend -enable-experimental-cxx-interop
    -Xfrontend -module-interface-preserve-types-as-written

    SWIFT_COMPILE_FLAGS_LINUX
    ${SWIFT_SDK_LINUX_CXX_OVERLAY_SWIFT_COMPILE_FLAGS}

    LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}"
    TARGET_SDKS ALL_APPLE_PLATFORMS LINUX
    INSTALL_IN_COMPONENT sdk-overlay
    INSTALL_WITH_SHARED
    DEPENDS libstdcxx-modulemap)
